#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H

#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QStringList>
#include <QDebug>
#include <tuple>

/**
 * @brief 数据库管理器类，用于管理和操作SQL Server数据库
 * 
 * 该类负责数据库连接、表创建、特征和规则的增删改查等功能
 */
class DatabaseManager : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父对象，默认为nullptr
     */
    explicit DatabaseManager(QObject *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~DatabaseManager();
    
    /**
     * @brief 连接到SQL Server数据库
     * @param hostname 数据库服务器地址
     * @param databaseName 数据库名称
     * @param username 用户名
     * @param password 密码
     * @return 如果连接成功则返回true，否则返回false
     */
    bool connectToDatabase(const QString &hostname, const QString &databaseName, 
                          const QString &username, const QString &password);
    
    /**
     * @brief 断开数据库连接
     */
    void disconnectFromDatabase();
    
    /**
     * @brief 使用默认配置打开数据库连接
     * @return 如果连接成功则返回true，否则返回false
     */
    bool openDatabase();
    
    /**
     * @brief 检查数据库连接是否有效
     * @return 如果连接有效则返回true，否则返回false
     */
    bool isConnected() const;
    
    /**
     * @brief 创建特征表和规则表
     * @return 如果创建成功则返回true，否则返回false
     */
    bool createTables();
    
    /**
     * @brief 添加特征
     * @param feature 特征名称
     * @return 如果添加成功则返回true，否则返回false
     */
    bool addFeature(const QString &feature);
    
    /**
     * @brief 获取所有特征
     * @return 包含所有特征的字符串列表
     */
    QStringList getAllFeatures();
    
    /**
     * @brief 获取所有特征（包含ID）
     * @return 包含所有特征的ID和名称的配对列表
     */
    QList<QPair<int, QString>> getAllFeaturesWithId();
    
    /**
     * @brief 清空所有特征
     * @return 如果清空成功则返回true，否则返回false
     */
    bool clearFeatures();
    
    /**
     * @brief 更新特征
     * @param id 特征ID
     * @param feature 新的特征名称
     * @return 如果更新成功则返回true，否则返回false
     */
    bool updateFeature(int id, const QString &feature);
    
    /**
     * @brief 删除特征
     * @param id 特征ID
     * @return 如果删除成功则返回true，否则返回false
     */
    bool deleteFeature(int id);
    
    /**
     * @brief 添加规则
     * @param ruleName 规则名称
     * @param category 规则类别
     * @param conditions 规则条件列表
     * @param conclusion 规则结论
     * @return 如果添加成功则返回true，否则返回false
     */
    bool addRule(const QString &ruleName, const QString &category, 
                const QStringList &conditions, const QString &conclusion);
    
    /**
     * @brief 获取所有规则
     * @return 包含所有规则的列表，每个规则是一个包含名称、类别、条件和结论的字符串列表
     */
    QList<QStringList> getAllRules();
    
    /**
     * @brief 获取所有规则（包含ID）
     * @return 包含所有规则的列表，每个规则是一个包含ID、条件列表和结论的元组
     */
    QList<std::tuple<int, QStringList, QString>> getAllRulesWithId();
    
    /**
     * @brief 获取所有规则的完整信息（包含ID、名称、类别）
     * @return 包含所有规则的列表，每个规则是一个包含ID、名称、类别、条件列表和结论的元组
     */
    QList<std::tuple<int, QString, QString, QStringList, QString>> getAllRulesWithFullInfo();
    
    /**
     * @brief 添加规则（简化版本）
     * @param conditions 规则条件列表
     * @param conclusion 规则结论
     * @return 如果添加成功则返回true，否则返回false
     */
    bool addRule(const QStringList &conditions, const QString &conclusion);
    
    /**
     * @brief 更新规则
     * @param id 规则ID
     * @param conditions 新的规则条件列表
     * @param conclusion 新的规则结论
     * @return 如果更新成功则返回true，否则返回false
     */
    bool updateRule(int id, const QStringList &conditions, const QString &conclusion);
    
    /**
     * @brief 更新规则（包含名称和类别）
     * @param id 规则ID
     * @param name 规则名称
     * @param category 规则类别
     * @param conditions 新的规则条件列表
     * @param conclusion 新的规则结论
     * @return 如果更新成功则返回true，否则返回false
     */
    bool updateRule(int id, const QString &name, const QString &category, const QStringList &conditions, const QString &conclusion);
    
    /**
     * @brief 删除规则
     * @param id 规则ID
     * @return 如果删除成功则返回true，否则返回false
     */
    bool deleteRule(int id);
    
    /**
     * @brief 清空所有规则
     * @return 如果清空成功则返回true，否则返回false
     */
    bool clearRules();
    
    /**
     * @brief 从文件导入特征到数据库
     * @param filePath 特征文件路径
     * @return 如果导入成功则返回true，否则返回false
     */
    bool importFeaturesFromFile(const QString &filePath);
    
    /**
     * @brief 从文件导入规则到数据库
     * @param filePath 规则文件路径
     * @return 如果导入成功则返回true，否则返回false
     */
    bool importRulesFromFile(const QString &filePath);
    
    /**
     * @brief 获取最后一个错误信息
     * @return 最后一个错误信息
     */
    QString lastError() const;

private:
    QSqlDatabase m_database;  ///< 数据库连接对象
    QString m_lastError;      ///< 最后一个错误信息
};

#endif // DATABASEMANAGER_H